/*
 * OrtErzeugung.java
 * 
 *  author: Daniel Rudigier
 *    date: 21.05.2008
 * 
 * 
 */
package ocumed.applikation.domainhandling;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ocumed.domaene.patientenverwaltung.DLand;
import ocumed.domaene.patientenverwaltung.DOrt;
import ocumed.persistenz.dao.DAOFactory;
import ocumed.persistenz.dao.OrtDAO;
import ocumed.persistenz.hibernate.OcLand;
import ocumed.persistenz.hibernate.OcOrt;

/**
 * @author Daniel Rudigier
 *
 */
public class OrtErzeugung  {
    private static final Log log = LogFactory.getLog(OrtErzeugung.class);
    
    // access the domain handler
    private DomainHandler dh;
    
    private OrtDAO m_ortDAO;
    
    /**
     * constructor
     * 
     */
    public OrtErzeugung() {
        dh = DomainHandler.getInstance();
        
        m_ortDAO = DAOFactory.get(DAOFactory.RDBMS).getOrtDAO();
    }

    /**
     * @param id
     * @return
     */
    public DOrt getDOrt(int id) {
        m_ortDAO.start();
        OcOrt ocOrt = m_ortDAO.findById(id);
        return getDOrt(ocOrt);
    }

    /**
     * Ort is not mandatory.
     * 
     * @param ocOrt
     * @return
     */
    public DOrt getDOrt(OcOrt ocOrt) {
        if (ocOrt != null) {
            DOrt ort = getO(ocOrt.getOrtid());

            if (ort != null) {
                return ort;
            }

            DLand land = getDLand(ocOrt.getOcLand());
            ort = new DOrt(ocOrt.getOrtid(), land, ocOrt.getOrtplz(), ocOrt
                    .getOrtname());
            dh.getOrte().add(ort);
            return ort;
        } else {
            return null;
        }
    }
    
    /**
     * cache 
     * 
     * @param ocLand
     * @return
     */
    public DLand getDLand(OcLand ocLand) {
        DLand land = getL(ocLand.getLandid());

        if (land != null) {
            return land;
        }

        land = new DLand(ocLand.getLandid(), ocLand.getLandname(), ocLand
                .getLandkurzform());
        dh.getLaender().add(land);
        return land;
    }
    
    /**
     * cache lookup
     * 
     * @param id
     * @return
     */
    private DOrt getO(int id) {
        for (DOrt ort : dh.getOrte()) {
            if (ort.getM_ortId() == id) {
                return ort;
            }
        }

        return null;
    }
    
    /**
     * cache lookup
     * 
     * @param id
     * @return
     */
    private DLand getL(int id) {
        for (DLand land : dh.getLaender()) {
            if (land.getM_landId() == id) {
                return land;
            }
        }

        return null;
    }

}
